package com.jt.interceptor;

import com.jt.utils.CookieUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * SpringMVC框架单独封装的拦截器API.简化程序调用过程.
 * 
 * 拦截器说明:
 * 一般使用拦截器时主要的目的是为了控制页面请求的跳转.
 *  1.preHandle  处器执行理器执行之前进行拦截
 *  2.postHandle 处理完成之后拦截
 *  3.afterCompletion 全部业务逻辑执行完成之后并且视图渲染之后拦截
 */
@Component
public class ManagerInterceptor implements HandlerInterceptor{
	
	   /**
	    * 控制用户登录
	    * boolean
	    *    true:  放行请求
	    *    false: 拦截请求  一般会与重定向关联
	    *    
	    * 拦截器业务分析:
        * 如果用户登陆则放行.   返回true
        * 如果用户未登录则拦截.  返回false
        * 
        * 如何判断用户是否登录
        * 1.检查用户是否有Cookie信息.
        * 2.检查redis服务器中是否有ticket信息.
        * 如果上述判断正常,则表示用户已登录,可以放行.
	    */
	@Autowired
	JedisCluster jedis;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		//获取cookie
		String cookieValue = CookieUtil.getCookieValue(request, "MANAGER");
		//判断cookie是否存在
		if(!StringUtils.isEmpty(cookieValue)) {
			//判断redis缓存中是否有值
			String jsonManager = jedis.get(cookieValue);
			if(!StringUtils.isEmpty(jsonManager)) {
				//缓存中有数据, 放行
				return true;
			}else {
				//缓存中没有数据，说明是错误的cookie
				 CookieUtil.deleteCookie(response, "MANAGER", "com.jt", "/");
			}
		}
		response.sendRedirect("/manager/login");
		return false;
	}
	
}
